package controller;

import java.util.List;
import org.hibernate.*;
import model.conexao.HibernateUtil;
import model.crudxml.Paciente;

public class PacienteCrudXML {
    
    public void salvar(Paciente paciente) {
        Session sessao = null;
        Transaction transacao = null;
        try {

            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.save(paciente);
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Atenção, ocorreu um problema ao tentar inserir \n " + 
                    "um paciente: \n"
                    + e.getMessage());

        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println("Erro ao fechar operação de inserção, Mensagem: "
                        + e.getMessage());
            }
        }
    }

    public void atualizar(Paciente paciente) {

        Session sessao = null;
        Transaction transacao = null;

        try {

            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.update(paciente);
            transacao.commit();

        } catch (HibernateException e) {
            System.out.println("Atenção, ocorreu um problema ao tentar atualizar um registro de paciente: \n " + 
                    e.getMessage());
        } finally {
            try {
                sessao.close();
            } catch (Throwable e) {
                System.out.println(
                        "Erro ao fechar operação de atualização. Mensagem:" + e.getMessage());
            }
        }
    }

    public void excluir(Paciente paciente) {

        Session sessao = null;
        Transaction transacao = null;

        try {

            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            sessao.delete(paciente);
            transacao.commit();

        } catch (HibernateException e) {

            System.out.println("Atenção, ocorreu um problema ao tentar excluir um registro de paciente: \n " + 
                    e.getMessage());

        } finally {

            try {
                sessao.close();
            } catch (Throwable e) {

                System.out.println("Erro ao fechar operação de exclusão. Mensagem: "
                        + e.getMessage());
            }
        }
    }
     
    public List<Paciente> listar() {

        Session sessao = null;
        Transaction transacao = null;
        Query consulta = null;
        List<Paciente> resultado = null;

        try {

            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Paciente");
            resultado = consulta.list();
            transacao.commit();
            return resultado;

        } catch (HibernateException e) {

            System.out.println("Não foi possível selecionar pacientes. Erro: "
                    + e.getMessage());
            throw new HibernateException(e);

        } finally {

            try {
                sessao.close();
            } catch (Throwable e) {

                System.out.println("Erro ao fechar operação de consulta. Mensagem: "
                        + e.getMessage());
            }
        }
    }
    
    public Paciente buscarPaciente(int valor) {

        Paciente paciente = null;
        Session sessao = null;
        Transaction transacao = null;
        Query consulta = null;

        try {

            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            consulta = sessao.createQuery("from Paciente where id_paciente = :parametro");
            consulta.setInteger("parametro", valor);
            paciente = (Paciente) consulta.uniqueResult();
            transacao.commit();
            return paciente;

        } catch (HibernateException e) {

            System.out.println("Não foi possível buscar paciente. Erro: "
                    + e.getMessage());

        } finally {

            try {

                sessao.close();

            } catch (Throwable e) {

                System.out.println("Erro ao fechar operação de buscar. Mensagem: "
                        + e.getMessage());
            }
        }
        return paciente;
    }
}